Solitary
# Load necessary libraries
# Reading and wrangling
library(googlesheets4)
library(readr)
library(tidyverse)
library(janitor)
library(lubridate)
library(DT)
# Plotting
library(ggplot2)
library(RColorBrewer)
# Tables
library(kableExtra)
# Load custom function
source("function_clean_facility_names.R", local = knitr::knit_global())
# Read in Sheet G-324A-19
df_324 <- read_sheet("https://docs.google.com/spreadsheets/d/1im5VSi3bIEi13O8WQ56wEIXSyNEstbGMylXXgD9bAG0/edit#gid=1858227071",
sheet="G-324A-19",
col_names = TRUE,
col_types = "c") %>%
clean_names() %>%
# Run custom cleaning function
clean_facility_names() %>%
# df specific changes
mutate(facility = as.factor(facility),
state = as.factor(state),
date = mdy(inspection_date),
current_inspection_date_from = mdy(current_inspection_date_from),
current_inspection_date_to = mdy(current_inspection_date_to)
) %>%
relocate(date, .before = inspection_date) %>%
mutate_at(c(20:49), as.numeric)
## Reading from "000inspection_forms"
## Range "'G-324A-19'"
## Warning: Expected 2 pieces. Missing pieces filled with `NA` in 1 rows [182].
## Warning: 1 failed to parse.
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
# Read Google Sheet incident worksheet, convert to data frame, and wrangle
df_324_inc <- read_sheet("https://docs.google.com/spreadsheets/d/1im5VSi3bIEi13O8WQ56wEIXSyNEstbGMylXXgD9bAG0/edit#gid=1858227071",
sheet="G-324A-19-inc",
col_types = "c") %>%
clean_names() %>%
# Run custom cleaning function
clean_facility_names() %>%
# df_specific changes
unite(date, year:month) %>%
mutate(facility = as.factor(facility),
state = as.factor(state),
date = ym(date)
) %>%
mutate_at(c(6:76), as.numeric)
## Reading from "000inspection_forms"
## Range "'G-324A-19-inc'"
## New names:
## * `Sexual abuse allegations detainee on staff/contractor/volunteer` -> `Sexual abuse allegations detainee on staff/contractor/volunteer...29`
## * `Sexual abuse allegations detainee on staff/contractor/volunteer` -> `Sexual abuse allegations detainee on staff/contractor/volunteer...34`
## Warning: Expected 2 pieces. Missing pieces filled with `NA` in 12 rows [2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152,
## 2153, 2154, 2155].
## Warning: 1 failed to parse.
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
## Warning in mask$eval_all_mutate(quo): NAs introduced by coercion
Summary Tables
Of the present 163 inspections reviewed so far, there are more than 34,000 instances of solitary. That is roughly 208 instances of solitary per inspection.
df_solitary <- df_324_inc %>%
# Select a subset of columns to work with
select(id,
facility,
date,
detainees_placed_in_administrative_segregation:
detainees_placed_in_segregation_for_mental_health_reasons) %>%
# Need the rowwise function to compute a row-at-a-time
# in the following mutate function
rowwise(id) %>%
# Create new total column
mutate(total_segregation = sum(c_across(detainees_placed_in_administrative_segregation:
detainees_placed_in_segregation_for_mental_health_reasons))) %>%
# Tidy
pivot_longer(.,
cols= detainees_placed_in_administrative_segregation:
total_segregation,
names_to = "segregation_type",
values_to = "segregation_count") %>%
# Remove NA
drop_na() %>%
# Explicitly set factor levels
mutate(segregation_type = factor(segregation_type, levels = c(
"detainees_placed_in_administrative_segregation",
"detainees_placed_in_disciplinary_segregation",
"detainees_placed_in_segregation_for_medical_reasons",
"detainees_placed_in_segregation_for_mental_health_reasons",
"total_segregation"
)))
df_solitary %>%
group_by(segregation_type) %>%
summarise(`Total Solitary by Type` = sum(segregation_count)) %>%
ungroup() %>%
kable(caption = "Total Solitary by Type",
col.names = c("Solitary Type", "Total Solitary Type")) %>%
kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 1.1: Total Solitary by Type
|
Solitary Type
|
Total Solitary Type
|
|
detainees_placed_in_administrative_segregation
|
17236
|
|
detainees_placed_in_disciplinary_segregation
|
9551
|
|
detainees_placed_in_segregation_for_medical_reasons
|
9869
|
|
detainees_placed_in_segregation_for_mental_health_reasons
|
1003
|
|
total_segregation
|
37336
|
df_solitary %>%
group_by(facility) %>%
summarise(total_segregation = sum(segregation_count)) %>%
arrange(desc(total_segregation)) %>%
ungroup() %>%
kable(caption = "Total Solitary by Facility",
col.names = c("Facility", "Total Solitary by Facility")) %>%
kable_styling(c("hover", "striped", "condensed", "responsive")) %>%
scroll_box(height = "300px")
Table 1.1: Total Solitary by Facility
|
Facility
|
Total Solitary by Facility
|
|
Krome Service Processing Center
|
10882
|
|
Eloy Detention Center
|
4556
|
|
El Paso Service Processing Center
|
3310
|
|
Prairieland Detention Center
|
2788
|
|
Henderson Detention Center
|
2638
|
|
Krome North Service Processing Center
|
2510
|
|
Winn Correctional Center
|
2474
|
|
Caroline Detention Facility
|
2438
|
|
Otero County Processing Center
|
2332
|
|
La Palma Correctional Center
|
2198
|
|
Adelanto ICE Processing Center - West
|
2178
|
|
Irwin County Detention Center
|
2172
|
|
River Correctional Center
|
1898
|
|
Stewart Detention Center
|
1814
|
|
South Texas ICE Processing Center
|
1696
|
|
Adams County Correctional Center
|
1456
|
|
York County Prison
|
1418
|
|
Montgomery Processing Center
|
1324
|
|
Adelanto ICE Processing Center - East
|
1308
|
|
Otay Mesa Detention Center
|
1266
|
|
Jackson Parish Correctional Center
|
1248
|
|
Aurora ICE Processing Center
|
1138
|
|
Aurora ICE Processing Center II - Annex
|
1138
|
|
Northwest ICE Processing Center
|
1028
|
|
Immigration Centers of America - Farmville
|
1006
|
|
Imperial Regional Detention Facility
|
1006
|
|
Glades County Detention Center
|
974
|
|
Port Isabel Service Processing Center
|
932
|
|
LaSalle ICE Processing Center
|
928
|
|
Sherburne County Jail
|
796
|
|
Pulaski County Detention Center
|
688
|
|
Catahoula Correctional Center
|
662
|
|
Pike County Correctional Facility
|
606
|
|
Jena LaSalle Detention Facility
|
602
|
|
Pine Prairie ICE Processing Center
|
554
|
|
Baker County Detention Center
|
468
|
|
McHenry County Adult Correctional Facility
|
462
|
|
Bluebonnet Detention Center
|
452
|
|
Florence Service Processing Center
|
388
|
|
Bergen County Jail
|
372
|
|
Houston Contract Detention Facility
|
372
|
|
Bristol County Jail and House of Correction
|
360
|
|
Wakulla County Detention Facility
|
342
|
|
Polk County Adult Detention Center
|
296
|
|
Calhoun County Correctional Center
|
274
|
|
Freeborn County Adult Detention Center
|
256
|
|
Richwood Correctional Center
|
256
|
|
Yuba County Jail
|
224
|
|
Hudson County Corrections and Rehabilitation Center
|
220
|
|
Essex County Correctional Facility
|
213
|
|
Limestone County Detention Center
|
206
|
|
Clinton County Correctional Facility
|
196
|
|
Donald W. Wyatt Detention Facility
|
194
|
|
Plymouth County Correctional Facility
|
176
|
|
El Valle Detention Facility
|
172
|
|
Dodge County Detention Facility
|
162
|
|
Geauga County Jail
|
150
|
|
Allen Parish Public Safety Complex
|
142
|
|
LaSalle Correctional Center
|
140
|
|
Okmulgee County Jail - Moore Detention Facility
|
140
|
|
Johnson County Corrections Center
|
136
|
|
Saint Clair County Jail
|
134
|
|
Elizabeth Contract Detention Facility
|
132
|
|
Folkston ICE Processing Center
|
126
|
|
Jerome Combs Detention Center
|
124
|
|
Joe Corley Processing Center
|
120
|
|
Nye County Detention Center
|
120
|
|
Mesa Verde ICE Processing Facility
|
108
|
|
Seneca County Jail
|
102
|
|
Kay County Detention Center
|
92
|
|
Worcester County Jail
|
82
|
|
Eden Detention Center
|
78
|
|
Clay County Jail
|
76
|
|
Butler County Jail
|
72
|
|
Torrance County Detention Facility
|
58
|
|
Hardin County Jail
|
56
|
|
Bossier Parish Corrections Center
|
54
|
|
Webb County Detention Center
|
54
|
|
Chippewa County Correctional Facility
|
50
|
|
David L. Moss Criminal Justice Center
|
46
|
|
Cambria County Prison
|
44
|
|
Montgomery County Jail
|
42
|
|
Strafford County Department of Corrections
|
42
|
|
Washoe County Detention Center
|
42
|
|
Hall County Department of Corrections
|
40
|
|
Rio Grande Detention Center
|
36
|
|
CCA Florence Correctional Center
|
34
|
|
Cibola County Correctional Center
|
32
|
|
Boone County Jail
|
28
|
|
Golden State Annex
|
26
|
|
Folkston ICE Processing Center Annex
|
24
|
|
Desert View Annex
|
22
|
|
Laredo Processing Center
|
22
|
|
Cass County Jail
|
20
|
|
Morgan County Adult Detention Center
|
20
|
|
Alamance County Detention Center
|
16
|
|
Teller County Jail
|
16
|
|
Northern Oregon Correctional Facility
|
14
|
|
Sheriff Al Cannon Detention Center
|
14
|
|
Carver County Jail
|
10
|
|
Howard County Detention Center
|
10
|
|
Orange County Correctional Facility
|
8
|
|
Shawnee County Department of Corrections - Adult Detention Center
|
6
|
|
Christian County Jail
|
4
|
|
Rolling Plains Detention Center
|
4
|
|
San Luis Regional Detention Center
|
4
|
|
Brooks County Detention Center
|
0
|
|
Broward Transitional Center
|
0
|
|
Coastal Bend Detention Center
|
0
|
|
Dorchester County Detention Center
|
0
|
|
Douglas County Department of Corrections
|
0
|
|
East Hidalgo Detention Center
|
0
|
|
LaSalle County Regional Detention Center
|
0
|
|
Monroe County Inmate Dormitory
|
0
|
|
Morrow County Correctional Facility
|
0
|
|
Platte County Detention Center
|
0
|
|
Robert A. Deyton Detention Facility
|
0
|
|
South Louisiana ICE Processing Center
|
0
|
|
T. Don Hutto Residential Center
|
0
|
|
Val Verde Correctional Facility
|
0
|
|
West Texas Detention Facility
|
0
|
|
Western Tennessee Detention Facility
|
0
|
|
Willacy County Regional Detention Facility
|
0
|
Facet Plots of Solitary by Facility
# Generating a linetype vector for use in the plot
plot_lines <- c(
"solid",
"solid",
"solid",
"solid",
"dotted"
)
# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(5, "Paired")
plot_colors[5] <- "#000000"
# Create plot labels
plot_labels <- c(
"Administrative",
"Disciplinary",
"Medical",
"Mental Health",
"Total")
df_solitary %>%
# Calling the plot and formatting
ggplot(aes(x=date,
y = segregation_count,
linetype = segregation_type))+
geom_line(aes(color = segregation_type), size = .65) +
# Set the color
scale_color_manual(
values = plot_colors,
name = "Solitary Type:",
labels = plot_labels)+
# Set the linetype
scale_linetype_manual(
values = plot_lines,
name = "Solitary Type:",
labels = plot_labels)+
labs(title = "Reported Use of Solitary")+
ylab("Number of Individuals Palced in Solitary")+
xlab("Date")+
theme(
strip.text = element_text(size = 8),
legend.position = "bottom"
)+
facet_wrap(~ facility, ncol=3)

Solitary Over 60 Days
# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(5, "Paired")
plot_colors[5] <- "#000000"
# Call the dataframe and select cols
df_324 %>%
select(id,
facility,
state,
date,
fac_operator,
admin_seg_60_ice,
disc_seg_60_ice) %>%
drop_na() %>%
# Need the rowwise function to compute a row-at-a-time
# in the following mutate function
rowwise(id) %>%
# Generate total col
mutate(total_seg_60 = sum(c_across(
admin_seg_60_ice:
disc_seg_60_ice
))) %>%
# Make tidy and filter
pivot_longer(cols = admin_seg_60_ice:disc_seg_60_ice,
names_to = "segregation_60_type",
values_to = "segregation_60_count") %>%
filter(segregation_60_type %in% c("admin_seg_60_ice", "disc_seg_60_ice")&
segregation_60_count > 0) %>%
# Initiate the plot and sort by sum
ggplot(aes(x = segregation_60_count,
y=reorder(fac_operator, segregation_60_count, sum),
fill=segregation_60_type))+
geom_bar(stat = "identity")+
# Set the color fill
scale_fill_brewer(type = "qual",
palette = "Paired",
name = "Segregation > 60 Type",
labels = c("Administrative",
"Disciplinary"))+
labs(title= "Segregation > 60 Days by Facility Operator",
x = "Segregation > 60 Days Count",
y = "Facility Operator")+
theme(legend.position = "bottom")

LS0tDQp0aXRsZTogIlNvbGl0YXJ5Ig0KYXV0aG9yOiAiTmF0aGFuIENyYWlnIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUEgJUIgJWQsICVZJylgIg0Kb3V0cHV0Og0KICBib29rZG93bjo6aHRtbF9kb2N1bWVudDI6IA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCmJpYmxpb2dyYXBoeTogW2NpdGF0aW9ucy5iaWIsIHBhY2thZ2VzLmJpYl0NCi0tLQ0KIyBTb2xpdGFyeQ0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCg0KYGBge3IgbG9hZC1saWJyYXJpZXN9DQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KDQojIFJlYWRpbmcgYW5kIHdyYW5nbGluZw0KbGlicmFyeShnb29nbGVzaGVldHM0KQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KERUKQ0KDQojIFBsb3R0aW5nDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCg0KIyBUYWJsZXMNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KIyBMb2FkIGN1c3RvbSBmdW5jdGlvbg0Kc291cmNlKCJmdW5jdGlvbl9jbGVhbl9mYWNpbGl0eV9uYW1lcy5SIiwgbG9jYWwgPSBrbml0cjo6a25pdF9nbG9iYWwoKSkNCmBgYA0KDQoNCmBgYHtyIHJlYWQtZGF0YS0zMjR9DQojIFJlYWQgaW4gU2hlZXQgRy0zMjRBLTE5DQpkZl8zMjQgPC0gcmVhZF9zaGVldCgiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMWltNVZTaTNiSUVpMTNPOFdRNTZ3RUlYU3lORXN0YkdNeWxYWGdEOWJBRzAvZWRpdCNnaWQ9MTg1ODIyNzA3MSIsDQogICAgICAgICAgICAgICAgIHNoZWV0PSJHLTMyNEEtMTkiLA0KICAgICAgICAgICAgICAgICBjb2xfbmFtZXMgPSBUUlVFLA0KICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSAiYyIpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUgDQogIA0KICAjIFJ1biBjdXN0b20gY2xlYW5pbmcgZnVuY3Rpb24NCiAgY2xlYW5fZmFjaWxpdHlfbmFtZXMoKSAlPiUgDQogIA0KICAjIGRmIHNwZWNpZmljIGNoYW5nZXMNCiAgbXV0YXRlKGZhY2lsaXR5ID0gYXMuZmFjdG9yKGZhY2lsaXR5KSwNCiAgICAgICAgIHN0YXRlID0gYXMuZmFjdG9yKHN0YXRlKSwNCiAgICAgICAgIGRhdGUgPSBtZHkoaW5zcGVjdGlvbl9kYXRlKSwNCiAgICAgICAgIGN1cnJlbnRfaW5zcGVjdGlvbl9kYXRlX2Zyb20gPSBtZHkoY3VycmVudF9pbnNwZWN0aW9uX2RhdGVfZnJvbSksDQogICAgICAgICBjdXJyZW50X2luc3BlY3Rpb25fZGF0ZV90byA9IG1keShjdXJyZW50X2luc3BlY3Rpb25fZGF0ZV90bykNCiAgICAgICAgICkgJT4lIA0KICByZWxvY2F0ZShkYXRlLCAuYmVmb3JlID0gaW5zcGVjdGlvbl9kYXRlKSAlPiUgDQogIG11dGF0ZV9hdChjKDIwOjQ5KSwgYXMubnVtZXJpYykNCmBgYA0KDQoNCmBgYHtyIHJlYWQtZGF0YS0zMjQtaW5jaWRlbnR9DQojIFJlYWQgR29vZ2xlIFNoZWV0IGluY2lkZW50IHdvcmtzaGVldCwgY29udmVydCB0byBkYXRhIGZyYW1lLCBhbmQgd3JhbmdsZQ0KZGZfMzI0X2luYyA8LSByZWFkX3NoZWV0KCJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xaW01VlNpM2JJRWkxM084V1E1NndFSVhTeU5Fc3RiR015bFhYZ0Q5YkFHMC9lZGl0I2dpZD0xODU4MjI3MDcxIiwNCiAgICAgICAgICAgICAgICAgc2hlZXQ9IkctMzI0QS0xOS1pbmMiLA0KICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSAiYyIpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUNCiAgDQogICMgUnVuIGN1c3RvbSBjbGVhbmluZyBmdW5jdGlvbg0KICBjbGVhbl9mYWNpbGl0eV9uYW1lcygpICU+JSANCg0KDQogICMgZGZfc3BlY2lmaWMgY2hhbmdlcw0KICB1bml0ZShkYXRlLCB5ZWFyOm1vbnRoKSAlPiUgDQogIG11dGF0ZShmYWNpbGl0eSA9IGFzLmZhY3RvcihmYWNpbGl0eSksDQogICAgICAgICBzdGF0ZSA9IGFzLmZhY3RvcihzdGF0ZSksDQogICAgICAgICBkYXRlID0geW0oZGF0ZSkNCiAgICAgICAgICkgJT4lIA0KICBtdXRhdGVfYXQoYyg2Ojc2KSwgYXMubnVtZXJpYykNCmBgYA0KDQoNCiMjIFN1bW1hcnkgVGFibGVzDQoNCk9mIHRoZSBwcmVzZW50IDE2MyBpbnNwZWN0aW9ucyByZXZpZXdlZCBzbyBmYXIsIHRoZXJlIGFyZSBtb3JlIHRoYW4gMzQsMDAwIGluc3RhbmNlcyBvZiBzb2xpdGFyeS4gVGhhdCBpcyByb3VnaGx5IDIwOCBpbnN0YW5jZXMgb2Ygc29saXRhcnkgcGVyIGluc3BlY3Rpb24uDQoNCmBgYHtyfQ0KZGZfc29saXRhcnkgPC0gZGZfMzI0X2luYyAlPiUNCiAgDQogICMgU2VsZWN0IGEgc3Vic2V0IG9mIGNvbHVtbnMgdG8gd29yayB3aXRoDQogIHNlbGVjdChpZCwNCiAgICAgICAgIGZhY2lsaXR5LA0KICAgICAgICAgZGF0ZSwNCiAgICAgICAgIGRldGFpbmVlc19wbGFjZWRfaW5fYWRtaW5pc3RyYXRpdmVfc2VncmVnYXRpb246DQogICAgICAgICAgIGRldGFpbmVlc19wbGFjZWRfaW5fc2VncmVnYXRpb25fZm9yX21lbnRhbF9oZWFsdGhfcmVhc29ucykgJT4lIA0KICANCiAgIyBOZWVkIHRoZSByb3d3aXNlIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYSByb3ctYXQtYS10aW1lDQogICMgaW4gdGhlIGZvbGxvd2luZyBtdXRhdGUgZnVuY3Rpb24NCiAgcm93d2lzZShpZCkgJT4lIA0KICANCiAgIyBDcmVhdGUgbmV3IHRvdGFsIGNvbHVtbg0KICBtdXRhdGUodG90YWxfc2VncmVnYXRpb24gPSBzdW0oY19hY3Jvc3MoZGV0YWluZWVzX3BsYWNlZF9pbl9hZG1pbmlzdHJhdGl2ZV9zZWdyZWdhdGlvbjoNCiAgICAgICAgICAgICAgICAgZGV0YWluZWVzX3BsYWNlZF9pbl9zZWdyZWdhdGlvbl9mb3JfbWVudGFsX2hlYWx0aF9yZWFzb25zKSkpICU+JSANCiAgDQogICMgVGlkeQ0KICBwaXZvdF9sb25nZXIoLiwNCiAgICAgICAgICAgICAgIGNvbHM9IGRldGFpbmVlc19wbGFjZWRfaW5fYWRtaW5pc3RyYXRpdmVfc2VncmVnYXRpb246DQogICAgICAgICAgICAgICAgIHRvdGFsX3NlZ3JlZ2F0aW9uLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAic2VncmVnYXRpb25fdHlwZSIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAic2VncmVnYXRpb25fY291bnQiKSAlPiUgDQogIA0KICAjIFJlbW92ZSBOQQ0KICBkcm9wX25hKCkgJT4lIA0KICANCiAgIyBFeHBsaWNpdGx5IHNldCBmYWN0b3IgbGV2ZWxzDQogIG11dGF0ZShzZWdyZWdhdGlvbl90eXBlID0gZmFjdG9yKHNlZ3JlZ2F0aW9uX3R5cGUsIGxldmVscyA9IGMoDQogICAgImRldGFpbmVlc19wbGFjZWRfaW5fYWRtaW5pc3RyYXRpdmVfc2VncmVnYXRpb24iLA0KICAgICJkZXRhaW5lZXNfcGxhY2VkX2luX2Rpc2NpcGxpbmFyeV9zZWdyZWdhdGlvbiIsDQogICAgImRldGFpbmVlc19wbGFjZWRfaW5fc2VncmVnYXRpb25fZm9yX21lZGljYWxfcmVhc29ucyIsDQogICAgImRldGFpbmVlc19wbGFjZWRfaW5fc2VncmVnYXRpb25fZm9yX21lbnRhbF9oZWFsdGhfcmVhc29ucyIsDQogICAgInRvdGFsX3NlZ3JlZ2F0aW9uIg0KICApKSkNCmBgYA0KDQpgYGB7cn0NCmRmX3NvbGl0YXJ5ICU+JSANCiAgZ3JvdXBfYnkoc2VncmVnYXRpb25fdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYFRvdGFsIFNvbGl0YXJ5IGJ5IFR5cGVgID0gc3VtKHNlZ3JlZ2F0aW9uX2NvdW50KSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvdGFsIFNvbGl0YXJ5IGJ5IFR5cGUiLA0KICAgICAgICBjb2wubmFtZXMgPSBjKCJTb2xpdGFyeSBUeXBlIiwgIlRvdGFsIFNvbGl0YXJ5IFR5cGUiKSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGMoImhvdmVyIiwgInN0cmlwZWQiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkNCg0KDQpkZl9zb2xpdGFyeSAlPiUgDQogIGdyb3VwX2J5KGZhY2lsaXR5KSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9zZWdyZWdhdGlvbiA9IHN1bShzZWdyZWdhdGlvbl9jb3VudCkpICU+JSANCiAgYXJyYW5nZShkZXNjKHRvdGFsX3NlZ3JlZ2F0aW9uKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvdGFsIFNvbGl0YXJ5IGJ5IEZhY2lsaXR5IiwNCiAgICAgICAgY29sLm5hbWVzID0gYygiRmFjaWxpdHkiLCAiVG90YWwgU29saXRhcnkgYnkgRmFjaWxpdHkiKSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGMoImhvdmVyIiwgInN0cmlwZWQiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkgJT4lIA0KICBzY3JvbGxfYm94KGhlaWdodCA9ICIzMDBweCIpDQpgYGANCg0KIyMgRmFjZXQgUGxvdHMgb2YgU29saXRhcnkgYnkgRmFjaWxpdHkNCg0KYGBge3Igc29saXRhcnktZmFjZXQsIGZpZy5oZWlnaHQ9NDB9DQojIEdlbmVyYXRpbmcgYSBsaW5ldHlwZSB2ZWN0b3IgZm9yIHVzZSBpbiB0aGUgcGxvdA0KcGxvdF9saW5lcyA8LSBjKA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgImRvdHRlZCINCiAgICApDQoNCiMgVXNlIENvbG9yIEJyZXdlciB0byBzZXQgY29sb3JzIGFuZCBtb2RpZnkNCiMgdGhlIGxhc3QgY29sb3IgdG8gYmUgYmxhY2sgZm9yIHRvdGFscy4NCnBsb3RfY29sb3JzIDwtIGJyZXdlci5wYWwoNSwgIlBhaXJlZCIpDQpwbG90X2NvbG9yc1s1XSA8LSAiIzAwMDAwMCINCg0KIyBDcmVhdGUgcGxvdCBsYWJlbHMNCnBsb3RfbGFiZWxzIDwtIGMoDQogICAgIkFkbWluaXN0cmF0aXZlIiwNCiAgICAiRGlzY2lwbGluYXJ5IiwNCiAgICAiTWVkaWNhbCIsDQogICAgIk1lbnRhbCBIZWFsdGgiLA0KICAgICJUb3RhbCIpDQoNCmRmX3NvbGl0YXJ5ICU+JSANCg0KIyBDYWxsaW5nIHRoZSBwbG90IGFuZCBmb3JtYXR0aW5nDQogIGdncGxvdChhZXMoeD1kYXRlLA0KICAgICAgICAgICAgIHkgPSBzZWdyZWdhdGlvbl9jb3VudCwNCiAgICAgICAgICAgICBsaW5ldHlwZSA9IHNlZ3JlZ2F0aW9uX3R5cGUpKSsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IHNlZ3JlZ2F0aW9uX3R5cGUpLCBzaXplID0gLjY1KSArDQogIA0KICAjIFNldCB0aGUgY29sb3INCiAgc2NhbGVfY29sb3JfbWFudWFsKA0KICB2YWx1ZXMgPSBwbG90X2NvbG9ycywNCiAgbmFtZSA9ICJTb2xpdGFyeSBUeXBlOiIsDQogIGxhYmVscyA9IHBsb3RfbGFiZWxzKSsNCiAgDQogICMgU2V0IHRoZSBsaW5ldHlwZQ0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwoDQogICAgdmFsdWVzID0gcGxvdF9saW5lcywNCiAgICAgIG5hbWUgPSAiU29saXRhcnkgVHlwZToiLA0KICAgIGxhYmVscyA9IHBsb3RfbGFiZWxzKSsNCiAgDQogIA0KICBsYWJzKHRpdGxlID0gIlJlcG9ydGVkIFVzZSBvZiBTb2xpdGFyeSIpKw0KICB5bGFiKCJOdW1iZXIgb2YgSW5kaXZpZHVhbHMgUGFsY2VkIGluIFNvbGl0YXJ5IikrDQogIHhsYWIoIkRhdGUiKSsNCiAgdGhlbWUoDQogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSINCiAgICApKw0KICAgIGZhY2V0X3dyYXAofiBmYWNpbGl0eSwgbmNvbD0zKQ0KYGBgDQoNCiMjIFNvbGl0YXJ5IE92ZXIgNjAgRGF5cw0KDQpgYGB7ciBzb2xpdGFyeS02MC1mYWNldH0NCg0KIyBVc2UgQ29sb3IgQnJld2VyIHRvIHNldCBjb2xvcnMgYW5kIG1vZGlmeQ0KIyB0aGUgbGFzdCBjb2xvciB0byBiZSBibGFjayBmb3IgdG90YWxzLg0KcGxvdF9jb2xvcnMgPC0gYnJld2VyLnBhbCg1LCAiUGFpcmVkIikNCnBsb3RfY29sb3JzWzVdIDwtICIjMDAwMDAwIg0KDQojIENhbGwgdGhlIGRhdGFmcmFtZSBhbmQgc2VsZWN0IGNvbHMNCmRmXzMyNCAlPiUgDQogIHNlbGVjdChpZCwNCiAgICAgICAgIGZhY2lsaXR5LA0KICAgICAgICAgc3RhdGUsDQogICAgICAgICBkYXRlLA0KICAgICAgICAgZmFjX29wZXJhdG9yLA0KICAgICAgICAgYWRtaW5fc2VnXzYwX2ljZSwNCiAgICAgICAgIGRpc2Nfc2VnXzYwX2ljZSkgJT4lIA0KICBkcm9wX25hKCkgJT4lIA0KICANCiAgIyBOZWVkIHRoZSByb3d3aXNlIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYSByb3ctYXQtYS10aW1lDQogICMgaW4gdGhlIGZvbGxvd2luZyBtdXRhdGUgZnVuY3Rpb24NCiAgcm93d2lzZShpZCkgJT4lIA0KICANCiAgIyBHZW5lcmF0ZSB0b3RhbCBjb2wNCiAgbXV0YXRlKHRvdGFsX3NlZ182MCA9IHN1bShjX2Fjcm9zcygNCiAgICAgICBhZG1pbl9zZWdfNjBfaWNlOg0KICAgICAgIGRpc2Nfc2VnXzYwX2ljZQ0KICApKSkgJT4lDQogIA0KICAjIE1ha2UgdGlkeSBhbmQgZmlsdGVyDQogIHBpdm90X2xvbmdlcihjb2xzID0gYWRtaW5fc2VnXzYwX2ljZTpkaXNjX3NlZ182MF9pY2UsDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJzZWdyZWdhdGlvbl82MF90eXBlIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJzZWdyZWdhdGlvbl82MF9jb3VudCIpICU+JQ0KICBmaWx0ZXIoc2VncmVnYXRpb25fNjBfdHlwZSAlaW4lIGMoImFkbWluX3NlZ182MF9pY2UiLCAiZGlzY19zZWdfNjBfaWNlIikmDQogICAgICAgICAgIHNlZ3JlZ2F0aW9uXzYwX2NvdW50ID4gMCkgJT4lDQogIA0KICAjIEluaXRpYXRlIHRoZSBwbG90IGFuZCBzb3J0IGJ5IHN1bQ0KICBnZ3Bsb3QoYWVzKHggPSBzZWdyZWdhdGlvbl82MF9jb3VudCwNCiAgICAgICAgICAgICB5PXJlb3JkZXIoZmFjX29wZXJhdG9yLCBzZWdyZWdhdGlvbl82MF9jb3VudCwgc3VtKSwNCiAgICAgICAgICAgICBmaWxsPXNlZ3JlZ2F0aW9uXzYwX3R5cGUpKSsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpKw0KICANCiAgIyBTZXQgdGhlIGNvbG9yIGZpbGwNCiAgc2NhbGVfZmlsbF9icmV3ZXIodHlwZSA9ICJxdWFsIiwNCiAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJQYWlyZWQiLA0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlNlZ3JlZ2F0aW9uID4gNjAgVHlwZSIsDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFkbWluaXN0cmF0aXZlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzY2lwbGluYXJ5IikpKw0KICBsYWJzKHRpdGxlPSAiU2VncmVnYXRpb24gPiA2MCBEYXlzIGJ5IEZhY2lsaXR5IE9wZXJhdG9yIiwNCiAgICAgICAgeCA9ICJTZWdyZWdhdGlvbiA+IDYwIERheXMgQ291bnQiLA0KICAgICAgICB5ID0gIkZhY2lsaXR5IE9wZXJhdG9yIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KYGBgDQoNCg0K